package project06.adt; 

import static java.lang.System.out;

public class PilaDinamica implements Pila{

	/**
	 * @param args
	 */
	
	public class NodoPila {

		private Object dato;
		private NodoPila sig;
	}
	
	private NodoPila nodo;

	public PilaDinamica() {
		this.nodo = null;
	}
	
	@Override
	public boolean apilar(Object obj) {
		try {
			NodoPila aux = this.nodo;
			this.nodo = new NodoPila();
			nodo.dato = obj;
			nodo.sig = aux;
		} catch(Exception e){
			return false;
		}
		
		return true;
	}
	
	@Override
	public Object desapilar() {
		if(nodo != null){
			Object dato = nodo.dato;
			this.nodo = this.nodo.sig;
			return dato;
		}
		
		return null;
	}

	@Override
	public void vaciar() {
		this.nodo = null;
		
	}

	@Override
	public Object verTope() {
		return this.nodo.dato;
	}

	@Override
	public boolean esVacia() {
		return this.nodo == null;
	}

	public static void main(String[] args) {
		//Prueba apilar
		Pila p1 = new PilaDinamica();
		for(int i=0;i<60;i++){
			p1.apilar(new Integer(i));
		}
		//Prueba esVacia
		out.println("Prueba esVacia:Resultado esperado:Resultado Esperado:false::"+p1.esVacia());
		//Prueba desapilar
		for(int i=0;i<60;i++){
			p1.desapilar();
		}
		//Prueba  esVacia
		out.println("Prueba esVacia:Resultado esperado:Resultado Esperado:true::"+p1.esVacia());

		for(int i=0;i<70;i++){
			p1.apilar(new Long(i));
		}
		//Prueba VerTope
		Object obj=null;
		boolean exito=true;
		while(!p1.esVacia()){
			obj=p1.verTope();
			obj=p1.verTope();
			exito&=obj.equals(p1.desapilar());
		}
		out.println("Prueba VerTope:Resultado esperado:Resultado Esperado:true::"+exito);
		
		for(int i=0;i<45;i++){
			p1.apilar(new Double(i));
		}
		p1.vaciar();
		//Prueba vaciar
		out.println("Prueba vaciar:Resultado esperado:Resultado Esperado:true::"+p1.esVacia());
	}
}
